package com.copa.l1790;

import java.util.HashMap;
import java.util.Map;

/**
 * @author copa
 * @createDate 2022-08-29 17:59
 * @function 一次遍历法
 */
public class Test1 {

    /**
     * 初次版本
     * @param s1
     * @param s2
     * @return
     */
//    public boolean areAlmostEqual(String s1, String s2) {
//        Map<Character, Integer> map = new HashMap<>();
//        int count = 0;
//
//        for (int i = 0; i < s1.length(); i++) {
//            char c1 = s1.charAt(i);
//            char c2 = s2.charAt(i);
//            if (c1 == c2) {
//                continue;
//            }
//            map.put(c1, map.getOrDefault(c1, 0) + 1);
//            map.put(c2, map.getOrDefault(c2, 0) + 1);
//            count++;
//            if (count == 3) {
//                return false;
//            }
//        }
//        // count == 2
//        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
//            if (!s1.contains(entry.getKey().toString()) || !s2.contains(entry.getKey().toString())) {
//                // 防止s1和s2都不相同的情况
//                return false;
//            }
//            if (entry.getValue() < 2) {
//                // 防止一个字符串只有s1|s2有的情况
//                return false;
//            }
//        }
//        return true;
//    }

    /**
     * 优化版本
     * @param s1
     * @param s2
     * @return
     */
    public boolean areAlmostEqual(String s1, String s2) {
        if (s1.equals(s2)) {
            return true;
        }
        int count = 0;
        Character s11 = null, s21 = null;
        for (int i = 0; i < s1.length(); i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            if (c1 == c2) {
                continue;
            }
            if (s11 == null) {
                s11 = c1;
                s21 = c2;
            } else {
                if (c1 != s21 || c2 != s11) {
                    return false;
                }
            }
            count++;
        }
        return count == 2;
    }

    public static void main(String[] args) {
//        String s1 = "aa";
//        String s2 = "ac";
        String s1 = "bank";
        String s2 = "kanb";
        System.out.println(new Test1().areAlmostEqual(s1, s2));
    }
}
